package com.smart.community.feign.property.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import java.io.Serializable;
import java.util.List;

/**
 * 物业公司支付信息DTO
 * 
 * 包含物业公司的收款码、支付账户、支付方式等支付相关信息
 * 用于缴费系统获取物业公司的收款信息，支持扫码支付
 * 
 * @author Wu.Liang
 * @version 1.0.0
 * @since 2025-01-30
 */
@Data
@Schema(description = "物业公司支付信息DTO")
public class PropertyCompanyPaymentInfoDTO implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    /**
     * 物业公司ID
     */
    @Schema(description = "物业公司ID")
    private Long propertyCompanyId;
    
    /**
     * 物业公司名称
     */
    @Schema(description = "物业公司名称")
    private String companyName;
    
    /**
     * 物业公司编码
     */
    @Schema(description = "物业公司编码")
    private String companyCode;
    
    /**
     * 收款二维码图片信息，JSON格式存储多个文件信息
     */
    @Schema(description = "收款二维码图片信息，JSON格式存储多个文件信息")
    private String paymentQrCode;
    
    /**
     * 收款账户
     */
    @Schema(description = "收款账户")
    private String paymentAccount;
    
    /**
     * 开户银行
     */
    @Schema(description = "开户银行")
    private String paymentBank;
    
    /**
     * 在线支付链接
     */
    @Schema(description = "在线支付链接")
    private String paymentLink;
    
    /**
     * 微信支付商户号
     */
    @Schema(description = "微信支付商户号")
    private String wechatPayMerchantId;
    
    /**
     * 支付宝商户号
     */
    @Schema(description = "支付宝商户号")
    private String alipayMerchantId;
    
    /**
     * 支持的支付方式列表
     */
    @Schema(description = "支持的支付方式列表")
    private List<String> supportedPaymentMethods;
    
    /**
     * 支付说明
     */
    @Schema(description = "支付说明")
    private String paymentDescription;
    
    /**
     * 联系电话
     */
    @Schema(description = "联系电话")
    private String contactPhone;
    
    /**
     * 服务热线
     */
    @Schema(description = "服务热线")
    private String serviceHotline;
    
    /**
     * 营业时间
     */
    @Schema(description = "营业时间")
    private String businessHours;
    
    /**
     * 是否启用在线支付
     */
    @Schema(description = "是否启用在线支付")
    private Boolean onlinePaymentEnabled;
    
    /**
     * 是否启用扫码支付
     */
    @Schema(description = "是否启用扫码支付")
    private Boolean qrCodePaymentEnabled;
    
    /**
     * 支付限额（单笔最大金额）
     */
    @Schema(description = "支付限额（单笔最大金额）")
    private java.math.BigDecimal maxPaymentAmount;
    
    /**
     * 支付限额（单笔最小金额）
     */
    @Schema(description = "支付限额（单笔最小金额）")
    private java.math.BigDecimal minPaymentAmount;
    
    /**
     * 创建时间
     */
    @Schema(description = "创建时间")
    private java.time.LocalDateTime createTime;
    
    /**
     * 更新时间
     */
    @Schema(description = "更新时间")
    private java.time.LocalDateTime updateTime;
    
    // ==================== 文件信息相关方法 ====================
    
    /**
     * 获取收款二维码文件信息列表
     * 
     * @return 文件信息列表
     */
    public List<com.smart.community.commons.dto.FileInfoDTO> getPaymentQrCodeFiles() {
        return com.smart.community.commons.utils.FileInfoUtils.fromJsonString(paymentQrCode);
    }
    
    /**
     * 设置收款二维码文件信息列表
     * 
     * @param fileInfoList 文件信息列表
     */
    public void setPaymentQrCodeFiles(List<com.smart.community.commons.dto.FileInfoDTO> fileInfoList) {
        this.paymentQrCode = com.smart.community.commons.utils.FileInfoUtils.toJsonString(fileInfoList);
    }
    
    /**
     * 获取第一个收款二维码文件URL（兼容旧数据）
     * 
     * @return 第一个文件URL
     */
    public String getFirstPaymentQrCodeUrl() {
        return com.smart.community.commons.utils.FileInfoUtils.getFirstFileUrlFromJson(paymentQrCode);
    }
    
    /**
     * 获取收款二维码文件数量
     * 
     * @return 文件数量
     */
    public int getPaymentQrCodeFileCount() {
        return com.smart.community.commons.utils.FileInfoUtils.getFileCount(paymentQrCode);
    }
    
    /**
     * 检查是否有收款二维码文件
     * 
     * @return 是否有文件
     */
    public boolean hasPaymentQrCodeFiles() {
        return getPaymentQrCodeFileCount() > 0;
    }
    
    /**
     * 设置收款二维码URL（兼容旧数据）
     * 
     * @param paymentQrCodeUrl 收款二维码URL
     */
    public void setPaymentQrCodeUrl(String paymentQrCodeUrl) {
        if (paymentQrCodeUrl != null) {
            List<com.smart.community.commons.dto.FileInfoDTO> fileInfoList = com.smart.community.commons.utils.FileInfoUtils
                .fromSingleFileUrl(paymentQrCodeUrl, "PAYMENT_QR", "WEB");
            this.paymentQrCode = com.smart.community.commons.utils.FileInfoUtils.toJsonString(fileInfoList);
        }
    }
    
    // ==================== 业务方法 ====================
    
    /**
     * 检查是否支持指定支付方式
     * 
     * @param paymentMethod 支付方式
     * @return 是否支持
     */
    public boolean supportsPaymentMethod(String paymentMethod) {
        if (supportedPaymentMethods == null || supportedPaymentMethods.isEmpty()) {
            return false;
        }
        return supportedPaymentMethods.contains(paymentMethod);
    }
    
    /**
     * 检查支付金额是否在限额范围内
     * 
     * @param amount 支付金额
     * @return 是否在限额范围内
     */
    public boolean isAmountInLimit(java.math.BigDecimal amount) {
        if (amount == null) {
            return false;
        }
        
        if (minPaymentAmount != null && amount.compareTo(minPaymentAmount) < 0) {
            return false;
        }
        
        if (maxPaymentAmount != null && amount.compareTo(maxPaymentAmount) > 0) {
            return false;
        }
        
        return true;
    }
    
    /**
     * 获取支付限额说明
     * 
     * @return 支付限额说明
     */
    public String getPaymentLimitDescription() {
        StringBuilder description = new StringBuilder();
        
        if (minPaymentAmount != null) {
            description.append("最低支付金额：¥").append(minPaymentAmount);
        }
        
        if (maxPaymentAmount != null) {
            if (description.length() > 0) {
                description.append("，");
            }
            description.append("最高支付金额：¥").append(maxPaymentAmount);
        }
        
        return description.toString();
    }
}
